package life.codelearing.controller;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import life.codelearing.bean.Employee;
import life.codelearing.bean.Msg;
import life.codelearing.service.EmployeeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 处理员工得CRUD请求
 */
@Controller
public class EmployeeController {

    @Autowired
    EmployeeService employeeService;

    /**
     * 查询员工数据，分页查询
     * @return
     */
    //@RequestMapping("/emps")
    public String getEmps(@RequestParam(value = "page",defaultValue = "1")Integer page,
                            Model model){
        // 引入pageHelper分页插件
        // 只需要在查询前，传入页码，以及每页需要展示的信息个数
        PageHelper.startPage(page,5);
        // 后面紧跟的这个查询就是分页查询
        List<Employee> emps = employeeService.getAll();
        // 使用PageInfo包装查询后的结果，只需要讲pageInfo传给页面即可，里面封装了详细的封装信息，包括查询出来的信息
        // 传入连续显示的页数
        PageInfo pageInfo = new PageInfo(emps,5);

        model.addAttribute("pageInfo",pageInfo);

        return "list";
    }

    /**
     * 将返回数据自动转换为json字符串
     * Response正常使用需要导入jackson包
     */
    @ResponseBody
    @RequestMapping("/emps")
    public Msg getEmpsWithJson(@RequestParam(value = "page",defaultValue = "1")Integer page){
        // 引入pageHelper分页插件
        // 只需要在查询前，传入页码，以及每页需要展示的信息个数
        PageHelper.startPage(page,5);
        // 后面紧跟的这个查询就是分页查询
        List<Employee> emps = employeeService.getAll();
        // 使用PageInfo包装查询后的结果，只需要讲pageInfo传给页面即可，里面封装了详细的封装信息，包括查询出来的信息
        // 传入连续显示的页数
        PageInfo pageInfo = new PageInfo(emps,5);

        return Msg.success().add("pageInfo",pageInfo);
    }

    /**
     * 保存新添加的员工信息
     */
    @ResponseBody
    @RequestMapping(value = "/emp",method = RequestMethod.POST)
    public Msg saveEmp(@Valid Employee employee, BindingResult result){
        if(result.hasErrors()){
            //新建map集合存放失败信息
            Map<String,Object> map = new HashMap<>();
            //校验失败，应该返回失败，在模态框中显示校验失败的错误信息
            List<FieldError> errors = result.getFieldErrors();
            for (FieldError fieldError:errors) {
                System.out.println("错误的字段名：" + fieldError.getField());
                System.out.println("错误信息：" + fieldError.getDefaultMessage());
                map.put(fieldError.getField(),fieldError.getDefaultMessage());
            }
            return Msg.fail().add("errorFields",map);
        }else {
            employeeService.saveEmp(employee);
            return Msg.success();
        }
    }

    /**
     * 检验用户名是否可用
     */
    @ResponseBody
    @RequestMapping("/checkuser")
    public Msg checkuser(@RequestParam("empName") String empName){
        //先判断用户名是否是合法的表达式
        String regx = "(^[a-zA-Z0-9_-]{6,16}$)|(^[\\u2E80-\\u9FFF]{2,5})";
        if(!empName.matches(regx)){
            return Msg.fail().add("va_msg","用户名必须是2-5位中文或者6-16位英文和数字的组合");
        }

        //数据库用户名重复校验
        Boolean isExist = employeeService.checkUser(empName);
        if(isExist){
            return Msg.success();
        }else {
            return Msg.fail().add("va_msg","用户名不可用");
        }
    }

    /**
     * 通过id查找employee对象信息
     * @param id
     * @return
     */
    @RequestMapping(value = "/emp/{id}",method = RequestMethod.GET)
    @ResponseBody
    public Msg getEmp(@PathVariable("id") Integer id){
        Employee employee = employeeService.getEmp(id);
        return Msg.success().add("emp",employee);
    }

    /**
     * 如果直接发送ajax=put的请求，封装数据失败
     * 问题：请求体中有数据，但employee对象封装数据失败
     *
     *  原因：
     *  Put请求，请求体中的数据，request.getParameter("empName")拿不到
     *  Tomcat不封装put方式的请求体数据为map，只封装post形式的数据
     *
     *  解决方法：
     *  SpringMVC提供了一个过滤器以解决此问题
     *  只需要在web.xml文件中配置HttpPutFormContentFilter过滤器过滤请求即可
     *  作用：将请求体中的数据解析包装成一个map
     *        并且重写request类，这样通过重写后的getParameter方法就可以获取到数据
     *
     * 更新员工信息
     * @param employee
     * @return
     */
    @RequestMapping(value = "/emp/{empId}",method = RequestMethod.PUT)
    @ResponseBody
    public Msg saveEmp(Employee employee){
        employeeService.updateEmp(employee);
        return Msg.success();
    }

    /**
     * 删除员工信息(批量删除或者单个删除)
     * @param ids
     * @return
     */
    @ResponseBody
    @RequestMapping(value="/emp/{ids}",method = RequestMethod.DELETE)
    public Msg deleteEmpByIds(@PathVariable("ids") String ids){
        //批量删除和单独删除
        if(ids.contains("-")){
            String[] string_ids = ids.split("-");
            //组装id的集合
            List<Integer> integer_ids = new ArrayList<>();
            for (String s : string_ids) {
                integer_ids.add(Integer.parseInt(s));
            }
            employeeService.deleteBatch(integer_ids);
        }else {
            Integer id = Integer.parseInt(ids);
            employeeService.deleteEmpById(id);
        }
        return Msg.success();
    }


}

















